#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
const int B=23,P=1e9+7;
class segtree{
  private:
    vector<pii> B;
    vector<int> S,T;
    inline void pushup(int u){
      S[u]=min(S[u<<1],S[u<<1|1]);
    }
    inline void pushdown(int u){
      if(T[u]){
        S[u<<1]+=T[u],S[u<<1|1]+=T[u];
        T[u<<1]+=T[u],T[u<<1|1]+=T[u],T[u]=0;
      }
    }
  public:
    segtree(int n){
      B.resize(n<<2),S.resize(n<<2),T.resize(n<<2);
      function<void(int,int,int)> build=[&](int u,int l,int r){
        B[u]=make_pair(l,r);
        if(l==r)return;
        int m=l+r>>1;
        build(u<<1,l,m),build(u<<1|1,m+1,r);
      };
      build(1,0,n-1);
    }
    inline void upd(int u,int p,int x){
      if(B[u].first==B[u].second){S[u]=x; return;}
      pushdown(u);
      int m=B[u].first+B[u].second>>1;
      upd(u<<1|(p>m),p,x),pushup(u);
    }
    inline void add(int u,int l,int r,int d){
      if(B[u].first>r||B[u].second<l)return;
      if(l<=B[u].first&&B[u].second<=r){S[u]+=d,T[u]+=d; return;}
      pushdown(u),add(u<<1,l,r,d),add(u<<1|1,l,r,d),pushup(u);
    }
    inline int query(int u,int l,int r){
      if(B[u].first>r||B[u].second<l)return 6e18;
      if(l<=B[u].first&&B[u].second<=r)return S[u];
      return pushdown(u),min(query(u<<1,l,r),query(u<<1|1,l,r));
    }
};
main(){
  freopen("knight.in","r",stdin);
  freopen("knight.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,k,c=0; cin>>n>>k;
  vector<int> a(n),f(n,6e18);
  for(auto &i:a)cin>>i;
  segtree t(n); t.upd(1,0,f[0]=a[0]);
  stack<pii> s; s.emplace(a[0],0);
  for(int i=1;i<n;i++){
    t.upd(1,i,f[i-1]+a[i]);
    while(!s.empty()&&s.top().first<=a[i]){
      int v,r; tie(v,r)=s.top(),s.pop();
      int l=s.empty()?0:s.top().second+1;
      t.add(1,l,r,a[i]-v);
    }
    f[i]=t.query(1,max(i-k+1,0ll),i),s.emplace(a[i],i);
  }
  for(int i:f)((c*=B)+=i)%=P;
  cout<<c<<endl;
  return 0;
}